package dao

import (
	"booksPro/model"
	"booksPro/utils"
)

// 向购物项表 cart_items中  添加一条购物项数据
func AddCartItem(cartItem *model.CartItem) error {
	sqlStr := "insert into cart_items(count,amount,book_id,cart_id) values(?,?,?,?)"
	_, err := utils.Db.Exec(sqlStr, cartItem.Count, cartItem.GetAmount(), cartItem.Book.ID, cartItem.CartID)
	if err != nil {
		return err
	}
	return nil
}

// GetCartItemByBookID  根据图书的id获取对应的购物项
func GetCartItemByBookID(bookId string) (*model.CartItem, error) {
	sqlStr := "select id,count,amount,cart_id from cart_items where book_id =? "
	row := utils.Db.QueryRow(sqlStr, bookId)
	cartItem := &model.CartItem{}
	err := row.Scan(&cartItem.CartItemID, &cartItem.Count, &cartItem.Amount, &cartItem.CartID)
	if err != nil {
		return nil, err
	}
	return cartItem, nil

}

// GetCartItemsByCartID 根据购物车的ID 获取购物车中所有的购物项
func GetCartItemsByCartID(cartID string) ([]*model.CartItem, error) {
	sqlStr := "select id,count,amount,cart_id,book_id  from cart_items where cart_id = ? "
	rows, err := utils.Db.Query(sqlStr, cartID)
	if err != nil {
		return nil, err
	}
	var cartItems []*model.CartItem
	for rows.Next() {
		var bookID string
		cartItem := &model.CartItem{}
		err := rows.Scan(&cartItem.CartItemID, &cartItem.Count, &cartItem.Amount, &cartItem.CartID, &bookID)
		if err != nil {
			return nil, err
		}
		book, _ := GetBookById(bookID)
		cartItem.Book = book
		cartItems = append(cartItems, cartItem)
	}
	return cartItems, nil
}
func GetCartItemsByCartIDAndBookID(bookID string, cartID string) (*model.CartItem, error) {
	sqlStr := "select id,count,amount,cart_id  from cart_items where book_id =? and cart_id = ? "
	row := utils.Db.QueryRow(sqlStr, bookID, cartID)
	cartItem := &model.CartItem{}
	err := row.Scan(&cartItem.CartItemID, &cartItem.Count, &cartItem.Amount, &cartItem.CartID)
	book, _ := GetBookById(bookID)
	cartItem.Book = book
	if err != nil {
		return nil, err
	}
	return cartItem, nil
}

// 根据图书的id 和 购物车id 将购物项的count +1
func UpdateCartItemCount(cartItem *model.CartItem) error {
	sqlStr := "update cart_items set count = ? , amount=? where id = ? and cart_id = ?"
	_, err := utils.Db.Exec(sqlStr, cartItem.Count, cartItem.GetAmount(), cartItem.CartItemID, cartItem.CartID)
	if err != nil {
		return err
	}
	return nil
}

// 通过购物项的 id的购物车的id 获取book_id
func GetBookIdByCartItemIDAndCartID(cartItem *model.CartItem) string {
	sqlStr := "select book_id from cart_items where id=? and cart_id =?"
	row := utils.Db.QueryRow(sqlStr, cartItem.CartItemID, cartItem.CartID)
	var bookID string
	row.Scan(&bookID)
	return bookID

}

func DeleteCartItemsByCartID(cartID string) error {
	sqlStr := "delete from cart_items where cart_id = ?"
	_, err := utils.Db.Exec(sqlStr, cartID)
	if err != nil {
		return err
	}
	return nil
}
func DeleteCartItemByCartItemID(cartItemID string) error {
	sqlStr := "delete from cart_items where id = ?"
	_, err := utils.Db.Exec(sqlStr, cartItemID)
	if err != nil {
		return err
	}
	return nil
}
